#include <stdio.h>
#include <stdlib.h>
#include "double_link_list.h"

/*创建空链表*/
LIST *list_create(void)
{
	LIST *list = malloc(sizeof(LIST));
	list->head = NULL;
    list->tail = NULL;
	return list;
}
void list_clear(LIST *list);
/*销毁链表*/
void list_destroy(LIST *list)
{
	/*清空链表，使其成为空链表*/
	list_clear(list);
	free(list);	
}
LIST_NODE *node_destroy(LIST_NODE *node, 
						LIST_NODE **tmp_prev)
{
	LIST_NODE *next = node->next;
	if(tmp_prev != NULL)
	{
		*tmp_prev = node->prev;
	}
	free(node);
	return next;
}
/*释放链表中的所有节点*/
void list_clear(LIST *list)
{
	while(list->head)
	{
		list->head = node_destroy(list->head,NULL);
	}
	list->tail = NULL;
}
/*随机访问链表节点*/
int *list_at(LIST *list, int pos)
{
	LIST_NODE *find = NULL;
	for(find=list->head; find; find=find->next)
	{
		if(!(pos--))
		{
			return &find->data;
		}
	}
	return NULL;
}

/*删除链表中指定节点*/
int list_erase(LIST *list, int pos)
{
	/*准备工作， 找到要删除的节点*/
    LIST_NODE *find = NULL;
	for(find=list->head; find; find=find->next)
	{
		if(!pos--)
		{
			LIST_NODE *prev = NULL;
			LIST_NODE *next = node_destroy(find, 
										  &prev);
            /*从链表中剔除当前节点
             调整前驱节点的next
			 调整后继节点的prev
             */
			if(prev == NULL) //要删除的节点为first
			{
				list->head = next;
			}
			else//删除节点非first
			{
			 	prev->next = next;
			}
			if(next == NULL)//要删除的节点为last
			{
				list->tail = prev;
			}
			else//删除节点非last
			{
				next->prev = prev;
			}
		}
	}
	return 0;
}

LIST_NODE *node_create(int data, LIST_NODE *prev,
						LIST_NODE *next)
{
	LIST_NODE *node = malloc(sizeof(LIST_NODE));
	node->data = data;
	node->prev = prev;
	node->next = next;
	return node;
}
/*尾部插入*/
void list_append(LIST *list, int data)
{
	/*需要关注head tail 
      新节点的 next prev
	  老的尾节点的next 
	*/
	/*1 动态申请节点空间，并初始化*/
	/*2 重置了链表尾结点*/
	list->tail = node_create(data,list->tail,NULL);
	/*3 如果原来为空链表， 修改head*/
    if(list->head == NULL)
	{
		list->head = list->tail;
	}
	/*4 如果原链表不为空*/
    else
	{
		/*原尾结点的next=新尾结点的地址*/
		list->tail->prev->next = list->tail;
	}
}
/*指定位置插入*/
int list_insert(LIST *list, int pos, int data)
{
	/* 准备工作 找到插入位置*/
    LIST_NODE *find = NULL;
	for(find=list->head; find; find=find->next)
	{
		if(!pos)//找到插入位置
		{
			/*1 申请空间并初始化*/
			LIST_NODE *node =node_create(data,find,
									 find->next);
			/*2 调整前驱和后继*/
			find->next = node;
			if(node->next)
			{
				node->next->prev = node;
			}
			else
			{
				/*3 调整tail*/
				list->tail = node;
			}
		}
		pos--;
	}
	return 0;	
}
/*后向遍历*/
void list_next_print(LIST *list)
{
	LIST_NODE *node = list->head;
    for(; node; node=node->next)
	{
		printf("%d ", node->data);
	}
	printf("\n");
}
/*前向遍历*/
void list_prev_print(LIST *list)
{
	
}
